/* 
  集中式版本控制工具：CVS SVN   早期90%的公司都用SVN
  分布式版本控制工具：git 是linus的作品


  集中式版本控制所有的备份，所有的记录都是管理在服务器上的  容错处理很差的，如果有一天磁盘坏了，所有的备份所有的数据都会丢失了
  
  分布式版本控制，是将代码仓库完整地镜像下来，包括完整的历史记录，如果有一天服务器发生故障了，可以使用任何一个镜像出来的本地仓库
  进行恢复
  每一次的克隆，都是对整个仓库的完整备份


  通俗点：集中式是将仓库放服务器上，而分布式每个克隆都是对仓库的一次完整地镜像，包括了所有的历史记录，每个本地
  都是一个仓库



*/

/* 
  两大状态：
  1.未跟踪

  2.已跟踪
    2.1 暂存区中缓存未提交到仓库：staged
    2.2 从暂存区中通过commit 提交到本地Git仓库：Unmodified 未修改
    2.2 修改了提交到仓库中的文件：Modified

*/


/* 
remote 远程的意思
  git log --pretty=oneline 一行显示日志更好看
  git log --pretty=oneline --graph   图结构，显示git 各个分支的情况

  git reset --hard HEAD^  回退上一个版本              版本回退  
  git reset --hard HEAD^^  回退上二个版本 
  git reset --hard HEAD~1000  回退到上1000个版本
  git reset --hard 校验和   一般选个7 8 位，找不到就再加几位   回退到指定版本

  git reflog 它可以查到每一次操作   记录每一次的操作

  http请求时无状态的，它不会记住你上一次的请求，每次请求都需要携带凭证
  ssh 是一种加密的网络传输协议 以非对称加密实现身份验证  公钥和私钥 

  origin是给远程仓库在本地起的别名

  git remote add origin(为远程仓库起的名字) 远程地址  本地仓库和远程仓库的连接
  
  git pull = git fetch + git merge

  给本地分支设置对应远程仓库的上游分支(跟踪分支)
  git branch --set-upstream-to = origin/master

  --allow-unrelated-histories  允许两个没有相同base(基础、祖先)的分支进行合并  Git2.9开始不允许两个没有相同base的分支合并，要允许就得用--allow-unrelated-histories


  日常操作顺序
  git add .
  git commit -m ""
  git pull
  git push


  自己开发一个全新的项目
  方案一：
  1.远程建立一个仓库
  2.本地clone下来就行
  3. git add .
  4. git commit -m ""
  5. gti push

  方案二：
  1.建立一个远程仓库
  2.git init  初始化本地仓库
  3.git remote add origin 仓库克隆地址
  5.git branch --set-upstream-to = origin/master  给本地当前分支(master分支)设置上游分支
  6.git add .
  7.git commit -m "" 
  8.git pull --allow-unrelated-histories  或者先git fetch 然后 git merge --allow-unrelated-histories
  9.git push


  git push origin head:main   head是本地分支(master)   main是远程分支     相当于git push origin master:main 
  将本地的master分支推送到远程的main分支

  git push origin master = git push origin master:master  将本地的master分支推送到远程的master分支

  push默认行为设置
  git config push.default  upstream找当前分支的远程上游分支   simple找当前分支对应名称的远程分支
  current 找当前分支对应相同名称的远程分支，如果找不到就在远程创建一个相同的分支  
 
  git tag 版本 对某一次提交打标签
  git tag 版本 -m "注释" 对某一次提交打标签

  git tag  查看所有标签
  git show 版本号  查看某个tag版本的详细信息

  git push origin v1.0.0   git psuh 远程仓库名 标签版版本号     这就是把某一个版本的标签推送到远程仓库中
  git push --tags 本地所有tag推送到服务器

  git tag -d 版本号  删除本地的tag
  git push origin -d 版本号  删除远程的标签

  git checkout 版本号  跳转到某一个标签的版本

*/

/* 
  分支本身就是一个指针，分支就是指向最后一次提交(的提交对象)
  git branch 分支名   创建分支
  git branch 查看分支列表
  git checkout 分支名  切换分支   本质上只是改了HEAD的指向而已

  git checkout -b 分支名  创建一个分支并立马切换到该分支

  git merge 分支名  合并分支    将该分支合并到本分支

  git branch -d 分支名    只是移除分支指针，所有的提交对象,提交历史都不会被移除


  git checkout --track origin/main   创建一个本地分支main并将它的上游分支设置为 origin/main 就是跟踪


  在远程没有本地的该分支的情况下，是无法直接push的，需要将本地分支push到远程
  git push origin devlop      git push 远程仓库名 分支名

  然后还得将本地的devlop建立上游分支 origin/devlop才能提交到远程的devlop分支中


  在作为组员克隆项目下来开发时： git checkout devlop
  1.直接克隆下来的只有一个主分支 master或者main这些
  2.假设我们要在devlop分支中进行开发
  3.我们只需git checkout devlop 即可，它会自动检测本地是否有devlop分支，如果没有就自动检测远程仓库中是否有devlop分支，如果有
  就直接在本地创建一个devlop分支，并让其跟踪远程仓库的devlop分支(也就是将本地devlop分支的上游分支设置为 origin/devlop)
  4.git checkout devlop相当于 git checkout -b devlop --track origin/devlop 

  删除本地分支：git branch -d 分支名称           两个操作跟tag的很像
  删除远程分支: git push origin -d 分支名称

  git rebase 用来当当前分支的base父级的分支名  就是 re base  给当前分支重新设置base
  演练时：
  现在feature中：git rebase master    这里相当于即将feature分支所指的提交对象的的base(父级)，设置为(指向)master分支所指的提交对象
  然后再到master中git merge feature

  黄金法则：永远不要再主分支中使用rebase


*/